//package com.yunche.postloan.utils;
//
//import com.yunche.postloan.exception.BaseErrorCode;
//import com.yunche.postloan.exception.BizException;
//import lombok.Cleanup;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.poi.hssf.usermodel.HSSFCellStyle;
//import org.apache.poi.hssf.usermodel.HSSFDateUtil;
//import org.apache.poi.ss.usermodel.HorizontalAlignment;
//import org.apache.poi.ss.usermodel.VerticalAlignment;
//import org.apache.poi.xssf.usermodel.*;
//
//import javax.servlet.http.HttpServletResponse;
//import java.io.BufferedOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.OutputStream;
//import java.lang.reflect.Field;
//import java.text.DateFormat;
//import java.text.DecimalFormat;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.LinkedList;
//import java.util.List;
//
///**
// * @Desc 穿件
// * ----------------
// * @CLASS_NAME: ExcelTemplateUtil
// * ----------------
// * @Author jovi
// * ----------------
// * @Date 2019-12-04 11:47
// */
//@Slf4j
//public class ExcelTemplateUtil<T> {
//
//    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//
//    Class<T> clazz;
//
//    public ExcelTemplateUtil(Class<T> clazz) {
//        this.clazz = clazz;
//    }
//
//
//    /**
//     * 创建excel模板
//     *
//     * @param sheetName
//     * @param titles
//     * @return
//     */
//    public static XSSFWorkbook createTemplate(String sheetName, String[] titles) {
//
//        log.info("sheetName:{},titles:{}", sheetName, titles);
//
//        // 创建一个工作簿(Excel的文档对象)
//        XSSFWorkbook xwb = new XSSFWorkbook();
//
//        // 创建一个Sheet(Excel的表单)
//        XSSFSheet xssfSheet = xwb.createSheet(sheetName);
//
//        // 创建Excel表头(rowNum:0表示表头),从0开始
//        XSSFRow xssfRow = xssfSheet.createRow(0);
//
//        // 设置缺省列高
//        xssfSheet.setDefaultRowHeightInPoints(25);
//        // 设置行的高度
//        xssfRow.setHeightInPoints(25);
//
//        // 格子单元样式
//        XSSFCellStyle xssfCellStyle = xwb.createCellStyle();
//
//        // 创建一个居中格式
//        xssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//
//        XSSFFont xssfFont = xwb.createFont();
//        // 设置字体加粗
//        xssfFont.setBold(true);
//        // 设置“宋体”字体
//        xssfFont.setFontName("宋体");
//        // 设置字体大小(14号)
//        xssfFont.setFontHeightInPoints((short) 14);
//        // 设置字体
//        xssfCellStyle.setFont(xssfFont);
//        // 设置水平居中
//        xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);
//        // 设置垂直居中
//        xssfCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//
//        //声明列对象
//        XSSFCell cell;
//
//        //创建标题
//        for (int i = 0; i < titles.length; i++) {
//            cell = xssfRow.createCell(i);
//            cell.setCellValue(titles[i]);
//            cell.setCellStyle(xssfCellStyle);
//        }
//
//        return xwb;
//    }
//
//
//    /**
//     * 导入数据，并返回报错的数据
//     *
//     * @param response   保留错误数据
//     * @param input      导入数据
//     * @param fieldsName 数据对应字段
//     * @return
//     */
//    public List<T> importExcel(HttpServletResponse response, InputStream input, List<String> fieldsName) {
//
//        List<T> list = new ArrayList<>();
//
//        XSSFWorkbook workbook;
//
//        Integer failNumber = 0;
//
//        try {
//
//            workbook = new XSSFWorkbook(input);
//            XSSFSheet sheet = workbook.getSheetAt(0);
//            int rows = sheet.getPhysicalNumberOfRows();
//
//            // 有数据时才处理
//            if (rows > 1) {
//                // 得到类的所有field
//                Field[] allFields = clazz.getDeclaredFields();
//
//                //有序的
//                List<Field> filterFields = new LinkedList<>();
//
//                for (String fieldName : fieldsName) {
//                    for (Field allField : allFields) {
//                        if (fieldName.equals(allField.getName())) {
//                            filterFields.add(allField);
//                        }
//                    }
//                }
//                // 从第2行开始取数据,默认第一行是表头
//                for (int i = 1; i < rows; i++) {
//                    failNumber = dealCel(list, sheet, filterFields, i, failNumber);
//                }
//            }
//        } catch (Exception e) {
//            throw new BizException("Excel导入数据异常", e, BaseErrorCode.EXCEL_DATA_IMPORT_EXCEPTION);
//        }
//
//
//        if (failNumber > 0) {
//
//            // 2.导出的Excel模板文件名称
//            DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
//            StringBuilder fileName = new StringBuilder("错误的贷后数据").append(dateFormat.format(new Date())).append(".xlsx");
//            // 3.清空response
//            response.reset();
//            try {
//                // 4.设置response的Header
//                String excelFileName = java.net.URLEncoder.encode(fileName.toString(), "UTF-8");
//                // 5.设置消息头内容格式,并指定编码格式
//                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//                response.addHeader("Content-Disposition", "attachment;filename=" + excelFileName);
//                @Cleanup OutputStream os = new BufferedOutputStream(response.getOutputStream());
//
//                // 6.将Excel写入到输出流中
//                workbook.write(os);
//            } catch (IOException e) {
//                throw new BizException("数据导入异常", e, BaseErrorCode.EXCEL_IO_EXCEPTION);
//            }
//        }
//
//
//        return list;
//    }
//
//    /**
//     * 处理单元格
//     *
//     * @param list
//     * @param sheet
//     * @param filterFields
//     * @param i
//     * @throws InstantiationException
//     * @throws IllegalAccessException
//     */
//    private Integer dealCel(List<T> list, XSSFSheet sheet, List<Field> filterFields, int i, Integer failNumber) throws InstantiationException, IllegalAccessException {
//
//        XSSFRow row = sheet.getRow(i);
//
//        int cellNum = row.getPhysicalNumberOfCells();
//
//        T entity = null;
//
//        boolean isSuccess = true;
//
//
//        for (int j = 0; j < cellNum; j++) {
//            XSSFCell cell = row.getCell(j);
//            if (cell == null) {
//                continue;
//            }
//            String value = judgeCellType(cell);
//            if (StringUtils.isBlank(value)) {
//                continue;
//            }
//            // 如果不存在实例则新建.
//            entity = (entity == null ? clazz.newInstance() : entity);
//            // 从map中得到对应列的field.
//            Field field = filterFields.get(j);
//
//            field.setAccessible(true);
//
//            // 取得类型,并根据对象类型设置值.
//            Class<?> fieldType = field.getType();
//
//            try {
//                setValue(entity, value, field, fieldType);
//            } catch (Exception e) {
//                log.error("该条记录导入失败，异常信息为:{}", e.getMessage(), e);
//                isSuccess = false;
//                failNumber++;
//                XSSFCell errorCell = row.createCell(cellNum + 1);
//                errorCell.setCellValue(value + "格式错误");
//                break;
//            }
//        }
//
//        if (isSuccess && entity != null) {
//            sheet.removeRow(row);
//            list.add(entity);
//        }
//
//        return failNumber;
//    }
//
//    /**
//     * 判断单元格中值的类型
//     *
//     * @param cell
//     * @return
//     */
//    private String judgeCellType(XSSFCell cell) {
//        String value;
//        switch (cell.getCellType()) {
//            // 数字
//            case XSSFCell.CELL_TYPE_NUMERIC:
//                //如果为时间格式的内容
//                if (HSSFDateUtil.isCellDateFormatted(cell)) {
//                    //注：format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制，若要24小时制，则把小h变为H即可，yyyy-MM-dd HH:mm:ss
//                    value = sdf.format(HSSFDateUtil.getJavaDate(cell.
//                            getNumericCellValue()));
//                    break;
//                } else {
//                    value = new DecimalFormat("0").format(cell.getNumericCellValue());
//                }
//                break;
//            // 字符串
//            case XSSFCell.CELL_TYPE_STRING:
//                value = cell.getStringCellValue();
//                break;
//            // Boolean
//            case XSSFCell.CELL_TYPE_BOOLEAN:
//                value = cell.getBooleanCellValue() + "";
//                break;
//            // 公式
//            case XSSFCell.CELL_TYPE_FORMULA:
//                value = cell.getCellFormula() + "";
//                break;
//            // 空值
//            case XSSFCell.CELL_TYPE_BLANK:
//                value = "";
//                break;
//            // 故障
//            case XSSFCell.CELL_TYPE_ERROR:
//                value = "非法字符";
//                break;
//            default:
//                value = "未知类型";
//                break;
//        }
//        return value;
//    }
//
//    /**
//     * @param entity
//     * @param value
//     * @param field
//     * @param fieldType
//     * @throws IllegalAccessException
//     */
//    private void setValue(T entity, String value, Field field, Class<?> fieldType) throws Exception {
//
//        if (String.class == fieldType) {
//            field.set(entity, String.valueOf(value));
//        } else if ((Integer.TYPE == fieldType)
//                || (Integer.class == fieldType)) {
//            field.set(entity, Integer.parseInt(value));
//        } else if ((Long.TYPE == fieldType)
//                || (Long.class == fieldType)) {
//            field.set(entity, Long.valueOf(value));
//        } else if ((Float.TYPE == fieldType)
//                || (Float.class == fieldType)) {
//            field.set(entity, Float.valueOf(value));
//        } else if ((Short.TYPE == fieldType)
//                || (Short.class == fieldType)) {
//            field.set(entity, Short.valueOf(value));
//        } else if ((Double.TYPE == fieldType)
//                || (Double.class == fieldType)) {
//            field.set(entity, Double.valueOf(value));
//        } else if (Character.TYPE == fieldType) {
//            if ((value != null) && (value.length() > 0)) {
//                field.set(entity, Character
//                        .valueOf(value.charAt(0)));
//            }
//        } else if ((Boolean.TYPE == fieldType)
//                || (Boolean.class == fieldType)) {
//            field.set(entity, "1".equals(value) ? true : false);
//        } else if (Date.class == fieldType) {
//            Date valueDate = sdf.parse(value);
//            field.set(entity, valueDate);
//        }
//
//    }
//
//}
